﻿#include <iostream>
#include <unordered_map>
#include <utility>
#include<thread>
#include <chrono>
#include "Serial.h"
#include "SQL_Conn.h"
#include "RFID.h"
#include "Weight.h"
#include "defines.h"
using namespace std;

void start_RFID_Thread();  
void start_Weight_Thread();
void handle_RFID_Thread(vector<RFID::RFID_Struct> rfid_arr);

int main() {
	thread rfid_thread(start_RFID_Thread);
	thread weight_thread(start_Weight_Thread);
	rfid_thread.join();
	weight_thread.join();
}

void start_RFID_Thread() {
	//串口连接 
	Serial* serial = new Serial();
	
	if(!serial->open_serial(RFIDCOM, CBR_115200)) {
		cout <<rfid_com_1<<" RFID Serial Error" << endl;
		return;
	}
	cout << "RFID串口打开成功" << endl;
	RFID rfid_data;
	int isBegin = 0;
	/*
	* isBegin = 0：表示从上次到现在一个标签都没有读到（鹅还未接近天线区域）
	* isBegin = 1：表示最近已有鹅经过天线区域（已经读到它的翅标）
	* isBegin = k：表示最近连续k次未读到任何鹅的标签（鹅已经离开天线区域）
	*/
	while (true) {
//2.读取并解析串口数据，存入数组
		int begin_len = rfid_data.rfid_data_arr.size();
		string receive_data = serial->read_RFID_data();
		rfid_data.get_RFID_Tag(receive_data);
		int end_len = rfid_data.rfid_data_arr.size();

//3.当串口读取到数据(arr数组有增长)，则设置开始
		if (end_len - begin_len > 0) {
			//存储已读取到数据，并设置isBegin为读取状态
			isBegin = 1;
		}
		//已经开始，且连续五十次都没有读取到数据，则说明没有鹅经过
		else if (isBegin > 0 && end_len - begin_len == 0 && isBegin < 50) {
			isBegin++;
		}

//4.当串口读取完数据，则进行处理(或者数组长度大于500)
		if (isBegin >= 50 || rfid_data.rfid_data_arr.size() > 500) {
			thread handle_rfid_thread(handle_RFID_Thread, rfid_data.rfid_data_arr);
			handle_rfid_thread.detach();
			rfid_data.rfid_data_arr.clear();
			//恢复到初始状态
			isBegin = 0;
		}
	}
	serial->closeHandle();
}

void start_Weight_Thread() {
	//串口连接
	Serial* serial = new Serial();

	if (!serial->open_serial(WEIGHTCOM, CBR_9600)) {
		cout << weight_com_1 << " Weight Serial Error" << endl;
		return;
	}
	cout << "体重称串口打开成功" << endl;
	Weight weight_obj;
	while (true) {
		string recv_weight =  serial->read_weight_64();
		if (recv_weight != "") {
			weight_obj.getWeight(recv_weight);
		}
	}
	serial->closeHandle();
}

void handle_RFID_Thread(vector<RFID::RFID_Struct> rfid_arr) {
	RFID::isEnterOrExit(rfid_arr);
}